package com.example.hilt.model

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

/**
 ********************************************************
 *Author: chinadragon
 *Time: 2023/9/7 10:56
 *Name:
 *Overview:
 *Usage:
 ********************************************************
 */
@Module
//@InstallIn(ActivityComponent::class)
// 把这个模块安装到Activity组件当中。只能在 Activity中包含的Fragment和View也可以使用 , 其他地方就无法使用了。
// 比如说，我们在Service中使用@Inject来对Retrofit类型的字段进行依赖注入

//  https://blog.csdn.net/guangdeshishe/article/details/122673455
//
//    ApplicationComponent 在 Dagger 2.30版本中已经标记过时了
//    ApplicationComponent 在 Dagger 2.31版本中就已经被移除了
//
//    使用SingletonComponent代替ApplicationComponent
@InstallIn(SingletonComponent::class)//如果我们希望刚才在NetworkModule中提供的Retrofit实例也能在Service中进行依赖注入，只需要这样修改就可以
class NetworkModule {

    @Singleton
    @Provides //在provideOkHttpClient()函数的上方加上@Provides注解，这样Hilt才能识别它。
    fun provideOkHttpClient(): OkHttpClient{
        return OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .build()
    }

    /*
        Hilt一共提供了7种组件作用域注解:

        如果想要在全程序范围内共用某个对象的实例，那么就使用@Singleton。
        如果想要在某个Activity，以及它内部包含的Fragment和View中共用某个对象的实例，那么就使用@ActivityScoped。以此类推。
     */

    @Singleton // 在全局都只会存在一份实例了。
    @Provides
    fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("https://www.apiopen.top/novelApi/")
            .client(okHttpClient)
            .build()
    }
}